/**
 * 递归
 * 方法去调用方法本身
 * 直接递归
 * 间接递归
 * 递归的条件
 * 1.递归的公式
 * 2.递归的终止
 * 3.递归的方向
 */
public class Recursion {
    public static void main(String[] args) {
        //System.out.println(fac(5));
        //System.out.println(f(5));
        System.err.println(3/10);
        System.err.println(15%10);

        //System.out.println(monkey(1));
    }

    /**
     * 利用递归去实现1-n的阶乘
     * 1.公式：f(n)=f(n-1)*n
     * 2.终止条件：f(1)=1;
     * 3.递归的方向朝着终止条件
     * @param num
     * @return
     */
    public static int fac(int num){
        if(num==1){
            return 1;//fac(1)=1
        }else{
            return fac(num-1)*num; //fac(n)=fac(num-1)*num
        }
    }

    /**
     * 利用递归去实现1-n的和 如 1+2+3+4+5+……+n
     * 1.公式：f(n)=f(n-1)+n
     * 2.终止条件：f(1)=1;
     * 3.递归的方向朝着终止条件
     * @param n
     * @return
     */
    public static int f(int n){
        if(n==1){
            return 1;//fac(1)=1
        }else{
            return f(n-1)+n; //fac(n)=fac(num-1)*num
        }
    }
    /**
     * 利用递归去查询猴子一共有多少桃子 如猴子第一天吃桃子总数的一半 然后又吃了一个
     * 第二天依旧如此……
     * 第10天桃子只剩下了一个
     * 我们尝试理解为
     * f(10)=1;
     * f(n)-f(n)/2-1=f(n+1);
     * 2(fn)-f(n)-2=2f(n+1);
     * f(n)= 2f(n)-2f(n+1)+2
     * f(n)= 2f(n+1)+2
     * 1.公式：f(n)= 2f(n+1)+2
     * 2.终止条件：f(10)=1;
     * 3.递归的方向朝着终止条件
     * @param n
     * @return
     */
    public static int monkey(int n){
        if(n==10){
            return 1;//fac(1)=1
        }else{
            return 2*monkey(n+1)+2; //fac(n)=fac(num-1)*num
        }
    }


}
